home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Revista CD Expert 37
/
CD Expert nº 37.iso
/
ComHok
/
directx.cab
/
dxdiafrn.chm
/
langref.js
< prev
next >
Wrap
Text File
|
1999-09-09
|
19KB
|
794 lines
//
// Common code
//
var ie4 = false;
var advanced = false;
var curLang = null;
var showAll = true;
var cook = null;
var baseUrl = document.scripts[document.scripts.length - 1].src.replace(/[^\/]+.js/, "");
if (navigator.appName == "Microsoft Internet Explorer") {
var ver = navigator.appVersion;
var v = new Number(ver.substring(0,ver.indexOf(".", 0)));
if (v >= 4) {
advanced = true;
ie4 = true;
// Look for 5.x buried somewhere in the version string.
var toks = ver.split(/[^0-9.]/);
if (toks) {
for (var i = 0; i < toks.length; i++) {
var tok = toks[i];
if (tok.indexOf(".", 0) > 0) {
if (tok >= 5)
ie4 = false;
}
}
}
}
}
if (advanced)
window.onload = bodyOnLoad;
function bodyOnClick()
{
if (advanced) {
hideTip();
closeMenu();
hideSeeAlso();
}
}
function bodyOnLoad()
{
if (advanced) {
initLangs();
initReftips();
initSeeAlso();
document.body.onclick = bodyOnClick;
}
}
//
// Language filtering
//
function initLangs()
{
var hdr = document.all.hdr;
if (!hdr)
return;
var langs = new Array;
var spans = document.all.tags("SPAN");
if (spans) {
var iElem = spans.length;
for (iElem = 0; iElem < spans.length; iElem++) {
var elem = spans[iElem];
if (elem.className == "lang") {
// Update the array of unique language names.
var a = elem.innerText.split(",");
for (var iTok = 0; iTok < a.length; iTok++) {
var m = a[iTok].match(/([A-Za-z].*[A-Za-z+])/);
if (m) {
var iLang = 0;
while (iLang < langs.length && langs[iLang] < m[1])
iLang++;
if (iLang == langs.length || langs[iLang] != m[1]) {
var before = langs.slice(0,iLang);
var after = langs.slice(iLang);
langs = before.concat(m[1]).concat(after);
}
}
}
}
}
}
if (langs.length > 0) {
var pres = document.all.tags("PRE");
if (pres) {
for (var iPre = 0; iPre < pres.length; iPre++)
initPreElem(pres[iPre]);
}
var obj = document.all.obj_cook;
if (obj && obj.object) {
cook = obj;
var lang = obj.getValue("lang");
var iLang = langs.length - 1;
while (iLang && langs[iLang] != lang)
iLang--;
curLang = langs[iLang];
if (obj.getValue("lang.all") != "1")
showAll = false;
}
var iLim = document.body.children.length;
var head = null;
for (var i = 0; i < iLim; i++) {
var elem = document.body.children[i];
if (elem.tagName.match(/^(P)|(PRE)|([DOU]L)$/))
break;
if (elem.tagName.match(/^H[1-6]$/)) {
head = elem;
head.insertAdjacentHTML('BeforeEnd', '<SPAN CLASS=ilang></SPAN>');
}
}
var td = hdr.insertCell(0);
if (td) {
// Localizable strings.
var L_Filter_Tip = "Language Filtering"; // tooltip for language button
var L_Language = "Language"; // heading for menu of programming languages
var L_Show_All = "Show All"; // label for 'show all languages' menu item
// Add the language button to the button bar.
td.className = "button1";
td.style.width = "19px";
td.onclick = langMenu;
td.innerHTML = '<IMG SRC="' + baseUrl + 'Filter.gif' + '" ALT="' +
L_Filter_Tip + '" BORDER=0>';
// Add the menu.
var div = '<DIV ID="lang_menu" CLASS=langMenu><B>' + L_Language + '</B><UL>';
for (var i = 0; i < langs.length; i++)
div += '<LI><A HREF="" ONCLICK="chooseLang(this)">' + langs[i] + '</A><BR>';
div += '<LI><A HREF="" ONCLICK="chooseAll()">' + L_Show_All + '</A></UL></DIV>';
document.body.insertAdjacentHTML('BeforeEnd', div);
}
if (!showAll)
filterLang();
}
}
function initPreElem(pre)
{
var htm0 = pre.outerHTML;
var reLang = /<span\b[^>]*class="?lang"?[^>]*>/i;
var iFirst = -1;
var iSecond = -1;
iFirst = htm0.search(reLang);
if (iFirst >= 0) {
iPos = iFirst + 17;
iMatch = htm0.substr(iPos).search(reLang);
if (iMatch >= 0)
iSecond = iPos + iMatch;
}
if (iSecond < 0) {
var htm1 = trimPreElem(htm0);
if (htm1 != htm0) {
pre.insertAdjacentHTML('AfterEnd', htm1);
pre.outerHTML = "";
}
}
else {
var rePairs = /<(\w+)\b[^>]*><\/\1>/gi;
var substr1 = htm0.substring(0,iSecond);
var tags1 = substr1.replace(/>[^<>]+(<|$)/g, ">$1");
var open1 = tags1.replace(rePairs, "");
open1 = open1.replace(rePairs, "");
var substr2 = htm0.substring(iSecond);
var tags2 = substr2.replace(/>[^<>]+</g, "><");
var open2 = tags2.replace(rePairs, "");
open2 = open2.replace(rePairs, "");
pre.insertAdjacentHTML('AfterEnd', open1 + substr2);
pre.insertAdjacentHTML('AfterEnd', trimPreElem(substr1 + open2));
pre.outerHTML = "";
}
}
function trimPreElem(htm)
{
return htm.replace(/[ \r\n]*((<\/[BI]>)*)[ \r\n]*<\/PRE>/g, "$1</PRE>").replace(
/\w*<\/SPAN>\w*((<[BI]>)*)\w*\r\n/g, "\r\n</SPAN>$1"
);
}
function getBlock(elem)
{
while (elem && elem.tagName.match(/^[BIUA]|(SPAN)|(CODE)|(TD)$/))
elem = elem.parentElement;
return elem;
}
function langMenu()
{
bodyOnClick();
window.event.returnValue = false;
window.event.cancelBubble = true;
var div = document.all.lang_menu;
var lnk = window.event.srcElement;
if (div && lnk) {
var x = lnk.offsetLeft + lnk.offsetWidth - div.offsetWidth;
div.style.pixelLeft = (x < 0) ? 0 : x;
div.style.pixelTop = lnk.offsetTop + lnk.offsetHeight;
div.style.visibility = "visible";
}
}
function chooseLang(item)
{
window.event.returnValue = false;
window.event.cancelBubble = true;
if (item) {
closeMenu();
curLang = item.innerText;
showAll = false;
}
if (cook) {
cook.putValue('lang', curLang);
cook.putValue('lang.all', '');
}
filterLang();
}
function chooseAll()
{
window.event.returnValue = false;
window.event.cancelBubble = true;
closeMenu();
showAll = true;
if (cook)
cook.putValue('lang.all', '1');
unfilterLang();
}
function closeMenu()
{
var div = document.all.lang_menu;
if (div && div.style.visibility != "hidden") {
var lnk = document.activeElement;
if (lnk && lnk.tagName == "A")
lnk.blur();
div.style.visibility = "hidden";
}
}
function getNext(elem)
{
for (var i = elem.sourceIndex + 1; i < document.all.length; i++) {
var next = document.all[i];
if (!elem.contains(next))
return next;
}
return null;
}
function filterMatch(text, name)
{
var a = text.split(",");
for (var iTok = 0; iTok < a.length; iTok++) {
var m = a[iTok].match(/([A-Za-z].*[A-Za-z+])/);
if (m && m[1] == name)
return true;
}
return false;
}
function topicHeading(head)
{
var iLim = document.body.children.length;
var idxLim = head.sourceIndex;
for (var i = 0; i < iLim; i++) {
var elem = document.body.children[i];
if (elem.sourceIndex < idxLim) {
if (elem.tagName.match(/^(P)|(PRE)|([DOU]L)$/))
return false;
}
else
break;
}
return true;
}
function filterLang()
{
var spans = document.all.tags("SPAN");
for (var i = 0; i < spans.length; i++) {
var elem = spans[i];
if (elem.className == "lang") {
var newVal = filterMatch(elem.innerText, curLang) ? "block" : "none";
var block = getBlock(elem);
block.style.display = newVal;
elem.style.display = "none";
if (block.tagName == "DT") {
var next = getNext(block);
if (next && next.tagName == "DD")
next.style.display = newVal;
}
else if (block.tagName == "DIV") {
block.className = "filtered2";
}
else if (block.tagName.match(/^H[1-6]$/)) {
if (topicHeading(block)) {
if (newVal != "none") {
var tag = null;
if (block.children && block.children.length) {
tag = block.children[block.children.length - 1];
if (tag.className == "ilang") {
tag.innerHTML = (newVal == "block") ?
' [Language: ' + curLang + ']' : "";
}
}
}
}
else {
var next = getNext(block);
while (next && !next.tagName.match(/^(H[1-6])|(DIV)$/)) {
next.style.display = newVal;
next = getNext(next);
}
}
}
}
else if (elem.className == "ilang") {
elem.innerHTML = ' [Language: ' + curLang + ']';
}
}
if (ie4) {
document.body.style.display = "none";
document.body.style.display = "block";
}
}
function unfilterLang(name)
{
var spans = document.all.tags("SPAN");
for (var i = 0; i < spans.length; i++) {
var elem = spans[i];
if (elem.className == "lang") {
var block = getBlock(elem);
block.style.display = "block";
elem.style.display = "inline";
if (block.tagName == "DT") {
var next = getNext(block);
if (next && next.tagName == "DD")
next.style.display = "block";
}
else if (block.tagName == "DIV") {
block.className = "filtered";
}
else if (block.tagName.match(/^H[1-6]$/)) {
if (topicHeading(block)) {
var tag = null;
if (block.children && block.children.length) {
tag = block.children[block.children.length - 1];
if (tag && tag.className == "ilang")
tag.innerHTML = "";
}
}
else {
var next = getNext(block);
while (next && !next.tagName.match(/^(H[1-6])|(DIV)$/)) {
next.style.display = "block";
next = getNext(next);
}
}
}
}
else if (elem.className == "ilang") {
elem.innerHTML = "";
}
}
}
//
// Reftips (parameter popups)
//
function initReftips()
{
var DLs = document.all.tags("DL");
var PREs = document.all.tags("PRE");
if (DLs && PREs) {
var iDL = 0;
var iPRE = 0;
var iSyntax = -1;
for (var iPRE = 0; iPRE < PREs.length; iPRE++) {
if (PREs[iPRE].className == "syntax") {
while (iDL < DLs.length && DLs[iDL].sourceIndex < PREs[iPRE].sourceIndex)
iDL++;
if (iDL < DLs.length) {
initSyntax(PREs[iPRE], DLs[iDL]);
iSyntax = iPRE;
}
else
break;
}
}
if (iSyntax >= 0) {
var last = PREs[iSyntax];
last.insertAdjacentHTML(
'AfterEnd',
'<DIV ID=reftip CLASS=reftip STYLE="position:absolute;visibility:hidden;overflow:visible;"></DIV>'
);
}
}
}
function initSyntax(pre, dl)
{
var strSyn = pre.outerHTML;
var ichStart = strSyn.indexOf('>', 0) + 1;
var terms = dl.children.tags("DT");
if (terms) {
for (var iTerm = 0; iTerm < terms.length; iTerm++) {
var words = terms[iTerm].innerText.replace(/\[.+\]/g, " ").replace(/,/g, " ").split(" ");
for (var iWord = 0; iWord < words.length; iWord++) {
var word = words[iWord];
if (word.length > 0) {
var ichMatch = findTerm(strSyn, ichStart, word);
while (ichMatch > 0) {
var strTag = '<A HREF="" ONCLICK="showTip(this)" CLASS="synParam">' + word + '</A>';
strSyn =
strSyn.slice(0, ichMatch) +
strTag +
strSyn.slice(ichMatch + word.length);
ichMatch = findTerm(strSyn, ichMatch + strTag.length, word);
}
}
}
}
}
// Replace the syntax block with our modified version.
pre.outerHTML = strSyn;
}
function findTerm(strSyn, ichPos, strTerm)
{
var ichMatch = strSyn.indexOf(strTerm, ichPos);
while (ichMatch >= 0) {
if ((ichMatch == 0 || !isalnum(strSyn.charAt(ichMatch - 1))) &&
!isalnum(strSyn.charAt(ichMatch + strTerm.length))) {
var ichComment = strSyn.indexOf("/*", ichPos);
while (ichComment >= 0) {
if (ichComment > ichMatch) {
ichComment = -1;
break;
}
var ichEnd = strSyn.indexOf("*/", ichComment);
if (ichEnd < 0 || ichEnd > ichMatch)
break;
ichComment = strSyn.indexOf("/*", ichEnd);
}
if (ichComment < 0) {
ichComment = strSyn.indexOf("//", ichPos);
while (ichComment >= 0) {
if (ichComment > ichMatch) {
ichComment = -1;
break;
}
var ichEnd = strSyn.indexOf("\n", ichComment);
if (ichEnd < 0 || ichEnd > ichMatch)
break;
ichComment = strSyn.indexOf("//", ichEnd);
}
}
if (ichComment < 0)
break;
}
ichMatch = strSyn.indexOf(strTerm, ichMatch + strTerm.length);
}
return ichMatch;
}
function isalnum(ch)
{
return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch == '_'));
}
function showTip(link)
{
bodyOnClick();
var tip = document.all.reftip;
if (!tip || !link)
return;
window.event.returnValue = false;
window.event.cancelBubble = true;
// Hide the tip if necessary and initialize its size.
tip.style.visibility = "hidden";
tip.style.pixelWidth = 260;
tip.style.pixelHeight = 24;
// Find the link target.
var term = null;
var def = null;
var DLs = document.all.tags("DL");
for (var iDL = 0; iDL < DLs.length; iDL++) {
if (DLs[iDL].sourceIndex > link.sourceIndex) {
var dl = DLs[iDL];
var iMax = dl.children.length - 1;
for (var iElem = 0; iElem < iMax; iElem++) {
var dt = dl.children[iElem];
if (dt.tagName == "DT" && dt.style.display != "none") {
if (findTerm(dt.innerText, 0, link.innerText) >= 0) {
var dd = dl.children[iElem + 1];
if (dd.tagName == "DD") {
term = dt;
def = dd;
}
break;
}
}
}
break;
}
}
if (def) {
window.linkElement = link;
window.linkTarget = term;
tip.innerHTML = '<DL><DT>' + term.innerHTML + '</DT><DD>' + def.innerHTML + '</DD></DL>';
window.setTimeout("moveTip()", 0);
}
}
function jumpParam()
{
hideTip();
window.linkTarget.scrollIntoView();
document.body.scrollLeft = 0;
flash(3);
}
function flash(c)
{
window.linkTarget.style.background = (c & 1) ? "#FFFF80" : "";
if (c)
window.setTimeout("flash(" + (c-1) + ")", 200);
}
function moveTip()
{
var tip = document.all.reftip;
var link = window.linkElement;
if (!tip || !link)
return; //error
var w = tip.offsetWidth;
var h = tip.offsetHeight;
if (w > tip.style.pixelWidth) {
tip.style.pixelWidth = w;
window.setTimeout("moveTip()", 0);
return;
}
var maxw = document.body.clientWidth;
var maxh = document.body.clientHeight;
if (h > maxh) {
if (w < maxw) {
w = w * 3 / 2;
tip.style.pixelWidth = (w < maxw) ? w : maxw;
window.setTimeout("moveTip()", 0);
return;
}
}
var x,y;
var linkLeft = link.offsetLeft - document.body.scrollLeft;
var linkRight = linkLeft + link.offsetWidth;
var linkTop = link.offsetTop - document.body.scrollTop;
var linkBottom = linkTop + link.offsetHeight;
var cxMin = link.offsetWidth - 24;
if (cxMin < 16)
cxMin = 16;
if (linkLeft + cxMin + w <= maxw) {
x = maxw - w;
if (x > linkRight + 8)
x = linkRight + 8;
y = maxh - h;
if (y > linkTop)
y = linkTop;
}
else if (linkBottom + h <= maxh) {
x = maxw - w;
if (x < 0)
x = 0;
y = linkBottom;
}
else if (w <= linkRight - cxMin) {
x = linkLeft - w - 8;
if (x < 0)
x = 0;
y = maxh - h;
if (y > linkTop)
y = linkTop;
}
else if (h <= linkTop) {
x = maxw - w;
if (x < 0)
x = 0;
y = linkTop - h;
}
else if (w >= maxw) {
x = 0;
y = linkBottom;
}
else {
w = w * 3 / 2;
tip.style.pixelWidth = (w < maxw) ? w : maxw;
window.setTimeout("moveTip()", 0);
return;
}
link.style.background = "#FFFF80";
tip.style.pixelLeft = x + document.body.scrollLeft;
tip.style.pixelTop = y + document.body.scrollTop;
tip.style.visibility = "visible";
}
function hideTip()
{
if (window.linkElement) {
window.linkElement.style.background = "";
window.linkElement = null;
}
var tip = document.all.reftip;
if (tip) {
tip.style.visibility = "hidden";
tip.innerHTML = "";
}
}
function beginsWith(s1, s2)
{
// Does s1 begin with s2?
return s1.substring(0, s2.length) == s2;
}
//
// See Also popups
//
function initSeeAlso()
{
// Localizable strings.
var L_See_Also = "See Also";
var L_Requirements = "Requirements";
var L_QuickInfo = "QuickInfo";
var hdr = document.all.hdr;
if (!hdr)
return;
var divS = new String;
var divR = new String;
var heads = document.all.tags("H4");
if (heads) {
for (var i = 0; i < heads.length; i++) {
var head = heads[i];
var txt = head.innerText;
if (beginsWith(txt, L_See_Also)) {
divS += head.outerHTML;
var next = getNext(head);
while (next && !next.tagName.match(/^(H[1-4])|(DIV)$/)) {
divS += next.outerHTML;
next = getNext(next);
}
}
else if (beginsWith(txt, L_Requirements) || beginsWith(txt, L_QuickInfo)) {
divR += head.outerHTML;
var next = getNext(head);
while (next && !next.tagName.match(/^(H[1-4])|(DIV)$/)) {
divR += next.outerHTML;
next = getNext(next);
}
}
}
}
var pos = getNext(hdr.parentElement);
if (pos) {
if (divR != "") {
divR = '<DIV ID=rpop CLASS=sapop>' + divR + '</DIV>';
var td = hdr.insertCell(0);
if (td) {
td.className = "button1";
td.style.width = "19px";
td.onclick = showRequirements;
td.innerHTML = '<IMG SRC="' + baseUrl + 'Requirements.gif' + '" ALT="' + L_Requirements + '" BORDER=0>';
if (ie4)
document.body.insertAdjacentHTML('AfterBegin', divR);
else
document.body.insertAdjacentHTML('BeforeEnd', divR);
}
}
if (divS != "") {
divS = '<DIV ID=sapop CLASS=sapop>' + divS + '</DIV>';
var td = hdr.insertCell(0);
if (td) {
td.className = "button1";
td.style.width = "19px";
td.onclick = showSeeAlso;
td.innerHTML = '<IMG SRC="' + baseUrl + 'SeeAlso.gif' + '" ALT="' + L_See_Also + '" BORDER=0>';
if (ie4)
document.body.insertAdjacentHTML('AfterBegin', divS);
else
document.body.insertAdjacentHTML('BeforeEnd', divS);
}
}
}
}
function showSeeAlso()
{
bodyOnClick();
window.event.returnValue = false;
window.event.cancelBubble = true;
var div = document.all.sapop;
var lnk = window.event.srcElement;
if (div && lnk) {
div.style.pixelTop = lnk.offsetTop + lnk.offsetHeight;
div.style.visibility = "visible";
}
}
function showRequirements()
{
bodyOnClick();
window.event.returnValue = false;
window.event.cancelBubble = true;
var div = document.all.rpop;
var lnk = window.event.srcElement;
if (div && lnk) {
div.style.pixelTop = lnk.offsetTop + lnk.offsetHeight;
div.style.visibility = "visible";
}
}
function hideSeeAlso()
{
var div = document.all.sapop;
if (div)
div.style.visibility = "hidden";
var div = document.all.rpop;
if (div)
div.style.visibility = "hidden";
}